package com.zx.mes.hyl.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.List;

/**
 * fast json convert util
 *
 * @author 华云龙
 * @date 2018-12-5
 */
public class FastJsonConvertUtil {

    private static final SerializerFeature[] FEATURES_WITH_NULL_VALUE = {SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullBooleanAsFalse,
            SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty};

    /**
     * <B>方法名称：</B>将JSON字符串转换为实体对象<BR>
     * <B>概要说明：</B>将JSON字符串转换为实体对象<BR>
     *
     * @param data  JSON字符串
     * @param clazz 转换对象
     * @return T
     */
    public static <T> T convertJSONToObject(String data, Class<T> clazz) {
        try {
            return JSON.parseObject(data, clazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * <B>方法名称：</B>将JSONObject对象转换为实体对象<BR>
     * <B>概要说明：</B>将JSONObject对象转换为实体对象<BR>
     *
     * @param data  JSONObject对象
     * @param clazz 转换对象
     * @return T
     */
    public static <T> T convertJSONToObject(JSONObject data, Class<T> clazz) {
        try {
            return JSONObject.toJavaObject(data, clazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * <B>方法名称：</B>将JSON字符串数组转为List集合对象<BR>
     * <B>概要说明：</B>将JSON字符串数组转为List集合对象<BR>
     *
     * @param data  JSON字符串数组
     * @param clazz 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> convertJSONArrayToList(String data, Class<T> clazz) {
        try {
            return JSON.parseArray(data, clazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * <B>方法名称：</B>将List<JSONObject>转为List集合对象<BR>
     * <B>概要说明：</B>将List<JSONObject>转为List集合对象<BR>
     *
     * @param data  List<JSONObject>
     * @param clazz 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> convertListJSONObjectToList(List<JSONObject> data, Class<T> clazz) {
        try {
            List<T> t = new ArrayList<>();
            for (JSONObject jsonObject : data) {
                t.add(convertJSONToObject(jsonObject, clazz));
            }
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * <B>方法名称：</B>将对象转为JSONObject对象<BR>
     * <B>概要说明：</B>将对象转为JSONObject对象<BR>
     *
     * @param obj 任意对象
     * @return JSONObject对象
     */
    public static JSONObject convertObjectToJSONObject(Object obj) {
        try {
            return (JSONObject) JSONObject.toJSON(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * <B>方法名称：</B>将对象转为JSON字符串<BR>
     * <B>概要说明：</B>将对象转为JSON字符串<BR>
     *
     * @param obj 任意对象
     * @return JSON字符串
     */
    public static String convertObjectToJSON(Object obj) {
        try {
            return JSON.toJSONString(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * <B>方法名称:</B>将一个对象转换成字符串<BR>
     * <B>概要说明:</B>将一个对象转换成字符串,如果对象属性填值,那么采取配置中所给值<BR>
     *
     * @param obj Object类型对象
     * @return String  str
     */
    public static String convertObjectToJSONWithNullValue(Object obj) {
        try {
            return JSON.toJSONString(obj, FEATURES_WITH_NULL_VALUE);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
